package ${enumFtlDO.packageName};

import java.util.Arrays;

public enum ${enumFtlDO.name} {

<#list enumFtlDO.fields as field >
    /** ${field.desc}<#if field.comment??>: ${field.comment}</#if> */
    ${field.name}(<#if enumFtlDO.valueType=='String'>"</#if>${field.value}<#if enumFtlDO.valueType=='String'>"</#if>, "${field.desc}"),

</#list>
    ;

    // 编码
    private ${enumFtlDO.valueType} value;

    // 描述
    private String desc;

    ${enumFtlDO.name}(${enumFtlDO.valueType} value, String desc) {
        this.value = value;
        this.desc = desc;
    }


    /** 获取枚举值 */
    public ${enumFtlDO.valueType} value(){
        return this.value;
    }

    /** 获取枚举描述 */
    public String desc(){
        return this.desc;
    }

    /** 获取 value 对应的枚举类型
     * @param value 枚举值
     * @return 不存在时返回 null
     */
    public static ${enumFtlDO.name} ofvalue(${enumFtlDO.valueType} value) {
        return Arrays.stream(${enumFtlDO.name}.values())
                .filter(item -> item.value.equals(value))
                .findAny()
                .orElse(null);
    }

    /** 获取 desc 对应的枚举类型
     * @param desc 描述
     * @return 不存在时返回 null
     */
    public static ${enumFtlDO.name} ofDesc(String desc) {
        return Arrays.stream(${enumFtlDO.name}.values())
                .filter(item -> item.value.equals(desc))
                .findAny()
                .orElse(null);
    }

    /** 根据 desc 对应的 value
     * @param desc 描述
     * @param defaultvalue 默认值
     * @return 不存在时返回默认值
     */
    public static ${enumFtlDO.valueType} getvalue(String desc, ${enumFtlDO.valueType}... defaultvalue) {
        ${enumFtlDO.name} ${enumFtlDO.name?uncap_first} = ofDesc(desc);
        return ${enumFtlDO.name?uncap_first} != null ?  ${enumFtlDO.name?uncap_first}.value() : defaultvalue.length > 0 ? defaultvalue[0] : null;
    }

    /** 根据 value 对应的 desc
     * @param value 编码
     * @param defaultDesc 默认值
     * @return 不存在时返回默认值
     */
    public static String getDesc(${enumFtlDO.valueType} value, String... defaultDesc) {
        ${enumFtlDO.name} ${enumFtlDO.name?uncap_first} = ofvalue(value);
        return ${enumFtlDO.name?uncap_first} != null ?  ${enumFtlDO.name?uncap_first}.desc() : defaultDesc.length > 0 ? defaultDesc[0] : null;
    }

}
